`timescale 1ns / 1ps
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Company: DTIT
// Engineer: YuJingJing
// 
// Create Date: 2024/07/06 10:18:07
// Design Name: 
// Module Name: prj_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module prj_top
(
    //CLOCK
    input                       gb_clk_in,

    //SGMII PHY
    input                       sgmii_refclk_p,
    input                       sgmii_refclk_n,
    input                       sgmii_rx_p    ,
    input                       sgmii_rx_n    ,
    output                      sgmii_tx_p    ,
    output                      sgmii_tx_n    ,
    output                      phy_resetn    ,
    inout                       phy_mdio      ,
    output                      phy_mdc       
);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Global Clock
wire udp_sys_clk_100m;   // 100M
wire clk_50m;            // 50M
wire mmcm_50m_lock;
wire monitor_ila_100m;

clk_wiz_0 u_clk_wiz_0    
(
    .clk_in1    (   gb_clk_in            ),
    .locked     (   mmcm_50m_lock        ),
    .clk_out1   (   clk_50m              ),
    .clk_out2   (   udp_sys_clk_100m     ),
    .clk_out3   (   monitor_ila_100m     )
); 
// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
reg [31:0] reset_count;
reg power_on_rst;
always @ (posedge clk_50m) begin
    if (!mmcm_50m_lock) begin
        reset_count <= 32'd0;
        power_on_rst   <= 1'b0;
    end
    else begin
        if (reset_count < 32'd500000000) begin
            power_on_rst  <= 1'b0;
            reset_count <= reset_count + 1'b1;
        end
        else begin
            power_on_rst  <= 1'b1;
            reset_count <= 32'd500000000;
        end
    end
end
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//UDP
wire        udp_sys_rstn;
wire        udp_ref_clk_200m;                      // 200M
wire        udp_user_clk_15d625m;                  // 15.625M
wire        udp_user_150m;

UDP_pll UDP_pll
(
    .clk_in1    (   udp_sys_clk_100m        ),
    .resetn     (   power_on_rst            ),     // input resetn
    .locked     (   udp_sys_rstn            ),
    .clk_out1   (   udp_ref_clk_200m        ),     // output clk_out1
    .clk_out2   (   udp_user_clk_15d625m    ),     // output clk_out2
    .clk_out3   (   udp_user_150m           )      // output clk_out3
);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//udp_protocol_stack
wire [1:0]          mac_link_status   ;
wire                udp_error_flag    ;
wire                mac_core_reset    ;
wire                dst_ip_unreachable;

// UDP RX
wire                app_rx_data_valid  ;
wire [63:0]         app_rx_data        ;
wire [7 :0]         app_rx_data_keep   ;
wire                app_rx_data_last   ;
wire [15:0]         app_rx_data_length ;

// UDP TX 
wire                app_tx_ready       ;
wire                app_tx_ack         ;
wire [15:0]         app_tx_data_length ;
wire                app_tx_data_request;
wire                app_tx_data_valid  ;
wire [63:0]         app_tx_data        ;
wire [7 :0]         app_tx_data_keep   ;
wire                app_tx_data_last   ;
wire                rx_udp_data_error  ;
wire [15:0]         rx_udp_src_port    ;

udp_protocol_stack udp_protocol_stack
(
    .clk_15_625                 (   udp_user_clk_15d625m    ),//15.625M
    .independent_clock_bufg     (   udp_ref_clk_200m        ),//200M
    .rst_n                      (   udp_sys_rstn            ),
    
    .gtrefclk1_p                (   sgmii_refclk_p          ),
    .gtrefclk1_n                (   sgmii_refclk_n          ),	
    
    .rx_p                       (   sgmii_rx_p              ),
    .rx_n                       (   sgmii_rx_n              ),		
    .tx_p                       (   sgmii_tx_p              ),
    .tx_n                       (   sgmii_tx_n              ),
    
    .phy_resetn                 (   phy_resetn              ),	
    .phy_mdio                   (   phy_mdio                ),
    .phy_mdc                    (   phy_mdc                 ),
    
    .Link_status                (   mac_link_status         ),
    .udp_error_flag             (   udp_error_flag          ),
    .mmcm_locked                (   udp_sys_rstn            ),
    .core_reset                 (   mac_core_reset          ),
    
    .rx_udp_data_error_o        (   rx_udp_data_error       ),
    .rx_udp_data_length_o       (   app_rx_data_length      ),
    .rx_udp_src_port_o          (   rx_udp_src_port         ),
    
    .app_tx_data_length         (   app_tx_data_length      ),
    .app_tx_data_request        (   app_tx_data_request     ),
    .app_tx_data_valid          (   app_tx_data_valid       ),
    .app_tx_data                (   app_tx_data             ),
    .app_tx_data_keep           (   app_tx_data_keep        ),
    .app_tx_data_last           (   app_tx_data_last        ),
    
    .udp_tx_ready               (   app_tx_ready            ),
    .app_tx_ack                 (   app_tx_ack              ),
    .dst_ip_unreachable         (   dst_ip_unreachable      ),
    
    .app_rx_data_valid          (   app_rx_data_valid       ),
    .app_rx_data                (   app_rx_data             ),
    .app_rx_data_keep           (   app_rx_data_keep        ),
    .app_rx_data_last           (   app_rx_data_last        )
);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
endmodule
